// sgu305
// 题意：
// 给定n(<=300)对数(ai, bi)，对于第i对数，所有x = k*ai + bi的x都属于这个系列
// （k是非负整数）。现在你要给这n个系列分配[1..m](m<=10^9)的不同的数，
// 每个系列分配一个，要使得分配到的数正好是这个系列的数的个数尽量多。
// 随意输出一种方案。
//
// 题解：
// 题目意思比较难理解，做法就是做一个二分图匹配。可以用map存。
//
// run: $exec < input
#include <iostream>
#include <algorithm>
#include <map>
#include <set>

int n;
long long m;

std::map<long long, std::set<int>> g;
std::map<long long, long long> linked;
std::set<long long> vis;

void add_edge(long long u, long long v)
{
	if (v < 1 || v > m) return;
	v += n + 1;
	g[u].insert(v);
	g[v].insert(u);
}

bool hungarian_dfs(int u)
{
	for (auto i : g[u]) {
		int v = i;
		if (vis.count(v)) continue;
		vis.insert(v);
		if (!linked.count(v) || hungarian_dfs(linked[v])) {
			linked[v] = u;
			linked[u] = v;
			return true;
		}
	}
	return false;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		long long a, b; std::cin >> a >> b;
		if (a < 0) {
			long long k1 = std::max(0ll, (m - b) / a);
			long long k2 = std::max(0ll, (a - b) / a);
			for (int j = 0; j <= n + 1 && j + k1 <= k2; j++)
				add_edge(i, a * (k1 + j) + b);
		} else if (a > 0) {
			long long k1 = std::max(0ll, (a - b) / a);
			long long k2 = (m - b) / a;
			for (int j = 0; j <= n + 1 && j + k1 <= k2; j++)
				add_edge(i, a * (k1 + j) + b);
		} else {
			add_edge(i, b);
		}
	}

	for (int i = 1; i <= n; i++) {
		vis.clear();
//		for (int j = 1; j <= n; j++) if (vis.count(j)) vis.erase(j);
		hungarian_dfs(i);
	}

	std::set<int> all;
	for (int i = 1; i <= n; i++)
		if (linked[i]) {
			linked[i] -= n + 1;
			all.insert(linked[i]);
		}
	int tot = 1;
	while (all.count(tot)) tot++;
	bool first = true;
	for (int i = 1; i <= n; i++) {
		if (!linked[i]) {
			linked[i] = tot++;
			while (all.count(tot)) tot++;
		}
		if (!first) std::cout << " ";
		else first = false;
		std::cout << linked[i];
		if (linked[i] < 1 || linked[i] > m) return 1;
	}
}

